package com.xzcedu.reflection;

import java.lang.reflect.Method;

/**
 * @author 徐州城
 * @version 1.0
 * 通过反射调用方法
 */
public class ReflectionAccessMethod {
    public static void main(String[] args) throws Exception {
        //1. 得到Boss 的Class对象
        Class<?> bossCls = Class.forName("com.xzcedu.reflection.Boss");

        //2. 创建一个对象
        Object o = bossCls.newInstance();

        //3. 调用public的hi()
        //3.1 得到hi方法对象
        Method hi = bossCls.getMethod("hi", String.class);
        //3.2 调用
        hi.invoke(o, "🐱");

        //4. 调用 private static 方法
        //4.1 获取say方法对象
        Method say = bossCls.getDeclaredMethod("say", int.class, String.class, char.class);
        //4.2 因为say方法是私有的，所以需要暴破才能调用
        say.setAccessible(true);
        Object x = say.invoke(null, 10, "🐊", 'X');
        System.out.println(x);

        //5. 在反射中，如果方法有返回值，统一返回object，但运行类型和方法定义的返回类型一致
        Object returnVal = say.invoke(null, 30, "李四", '男');
        System.out.println(returnVal.getClass());
    }
}

class Boss {
    private static String name;
    public int age;

    public Boss() {
    }

    private static String say(int n, String s, char c) {
        return n + " " + s + " " + c;
    }

    public void hi(String s) {
        System.out.println("hi " + s);
    }
}
